package main

import "fmt"

/*
  工厂方法模式 创建一个工厂，将产品的创建逻辑写在子类之中
  工厂方法模式只有一个抽象产品类
  例子：工厂创建肉类食物
*/

type Meat interface {
	Eat()
} 

type Factory interface {
	Create() Meat
}

// 牛肉工厂
type BeefFactory struct {
}

func (bf BeefFactory) Create() Food {
	//工厂实现的逻辑
	return Beef{}
}
// 鱼工厂
type FishFactory struct {
}

func (ff FishFactory) Create() Food {
	//工厂实现的逻辑
	return Fish{}
}

type Beef struct {
}

type Fish struct {
}

func (b Beef) Eat()  {
	fmt.Println("eat beef")
}

func (f Fish) Eat()  {
	fmt.Println("eat fish")
}

func main() {
	//牛肉工厂
	bf := BeefFactory{}
	bf.Create().Eat()
	//鱼工厂
	ff := FishFactory{}
	ff.Create().Eat()
}